package com.buss.core.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.buss.core.dao.SysmenuDao;
import com.buss.core.dic.MenuType;
import com.buss.core.model.Sysmenu;
import com.buss.core.persistence.Paginalbe;
import com.buss.core.persistence.ResultList;
import com.buss.core.service.SysmenuService;

@Service
public class SysmenuServiceImpl implements SysmenuService {
	
	private static final long serialVersionUID = -5065628949808511255L;

	@Autowired
	private SysmenuDao sysmenuDao;
	
	public void deleteMenu(Long[] ids) {
		for(Long id : ids){
			Sysmenu sysmenu = sysmenuDao.loadSysMenu(id);
			if(sysmenu != null && sysmenu.getParentId() == null && !((sysmenu.getParentId()== null))){
				sysmenuDao.updateNodeNum(sysmenu.getParentId(), 1);
			}
		}
		sysmenuDao.deleteMenu(ids);
	}

	public void editSysMenu(Sysmenu sysMenu) {
		Sysmenu tmpMenu = sysmenuDao.loadSysMenu(sysMenu.getParentId());
		if(tmpMenu != null && !(sysMenu.getParentId().equals(sysMenu.getParentId()))){
			if(!sysMenu.getParentId().equals("0")){
				sysmenuDao.updateNodeNum(sysMenu.getParentId(), -1);
			}
			if(!tmpMenu.getParentId().equals("0")){
				sysmenuDao.updateNodeNum(tmpMenu.getParentId(), 1);
			}
		}
		sysmenuDao.editSysMenu(sysMenu);
		
	}

	public Sysmenu loadSysMenu(Long id) {
		return sysmenuDao.loadSysMenu(id);
	}

	public Sysmenu mergeSysMenu(Sysmenu sysMenu) {
		if(sysMenu.getId() != null){
			Sysmenu tmpMenu = sysmenuDao.loadSysMenu(sysMenu.getId());
			if(tmpMenu != null){
				if(tmpMenu != null && !(sysMenu.getParentId().equals(sysMenu.getParentId()))){
					if(!sysMenu.getParentId().equals("0")){
						sysmenuDao.updateNodeNum(sysMenu.getParentId(), -1);
					}
					if(!tmpMenu.getParentId().equals("0")){
						sysmenuDao.updateNodeNum(tmpMenu.getParentId(), 1);
					}
				}
			}else{
				sysMenu.setNodeNum(0L);
			}
		}else{
			sysMenu.setNodeNum(0L);
		}
		return sysmenuDao.mergeSysMenu(sysMenu);
	}

	public ResultList<Sysmenu> querySysMenu(Long parentId, MenuType menuType,Boolean disabled) {
		return sysmenuDao.querySysMenu(parentId, menuType,disabled);
	}

	public Map<Long, String> queryRoleMenuToMap(Long[] roleId,Long parentId,MenuType menuType,Boolean disabled,Paginalbe page){
		return sysmenuDao.queryRoleMenuToMap(roleId, parentId, menuType, disabled, page);
	}
	
	public ResultList<Sysmenu> querySysMenuByRole(Long[] roleId,Long parentId,MenuType menuType,Boolean disabled,Paginalbe page){
		return sysmenuDao.querySysMenuByRole(roleId, parentId, menuType,disabled, page);
	}
	
	public void saveSysMenu(Sysmenu sysMenu) {
		if(!sysMenu.getParentId().equals("0")){
			sysmenuDao.updateNodeNum(sysMenu.getParentId(), 1);
		}else{
			sysMenu.setNodeNum(0L);
		}
		sysmenuDao.saveSysMenu(sysMenu);
	}

	public List<Sysmenu> querySysmenuByChild(Long menuId) {
		List<Sysmenu> menus = new ArrayList<Sysmenu>();
		Sysmenu menu = loadSysMenu(menuId);
		menus.add(menu);
		queryParentSysmenu(menu.getParentId(), menus);
		return menus;
	}

	private void queryParentSysmenu(Long menuId,List<Sysmenu> menus){
		if(menuId == 0L){
			return;
		}
		Sysmenu menu = loadSysMenu(menuId);
		menus.add(menu);
		queryParentSysmenu(menu.getParentId(), menus);
	}

	public ResultList<Sysmenu> queryAllMenuenuByRole(Long[] roleId,
			Long parentId, MenuType menuType, Boolean disabled, Paginalbe page) {
		
		return sysmenuDao.queryAllMenuenuByRole(roleId, parentId, menuType, disabled, page);
	}
	
}
